python写一个自动在网页搜索资源并下载的程序

您所在的位置:网站首页 网页搜索 数字敦煌 搜索素材 python写一个自动在网页搜索资源并下载的程序

python写一个自动在网页搜索资源并下载的程序

2023-09-18 01:04| 来源: 网络整理| 查看: 265

python写一个自动在网页搜索资源并下载的程序

从始至终就是一个懒虫的无理取闹~

故事起因

关于开题报告,有一件事是不得不考虑的,那就是文献管理,需要自己在网上将所要引用的文章的引用文件下载下来导入管理器中(endnote),如若已经下载好了一百多篇论文!得一个一个去搜下载引用文献文件怎么办?

于是乎,也就有了这个命题——如何写一个python程序自动去网上下载资源

写程序前的准备

除了安装Python(我使用的python3.7)外,还需要安装selenium和pymouse,前者用于操作浏览器,后者用于操作鼠标 关于这两个的安装可以去百度搜,每个人可能遇到的问题都不一样,但都不难解决,大部分需要安装的都可以用pip install解决(什么?你说pip install安装失败?一次不行就两次,两次不行就三次,有一个依赖项我装了5次才成功,所以在这里建议,只要是出来进度条后产生的失败多试几次便能成功,如果超过十次还是不行,建议手动安装。

pymouse需要安装依赖pywin32,详细教程如下面的链接: https://www.cnblogs.com/SH170706/p/9640110.html

另外还需要安装你所要使用的浏览器的驱动,以便python可以操作浏览器,常用的是火狐和谷歌浏览器,网上关于这两个的教程最多

话不多说,上代码~

代码 import os import time from selenium import webdriver from pymouse import PyMouse global index global filenames global filenames_cl index = 0 filenames = [] filenames_cl = [] def file_name(file_dir): global filenames for root, dirs, filenames in os.walk(file_dir): print(root) #当前目录路径 #print(dirs) #当前路径下所有子目录 print(filenames) #当前路径下所有非目录子文件 file_dir = "D:\我的文档" file_name(file_dir) while(filenames): file_name = filenames.pop() filenames_cl.append(file_name[4:file_name.rfind('_')]) for filename_cl in filenames_cl: driver = webdriver.Firefox()#(firefox_profile=profile) #打开火狐浏览器 driver.get('https://www.cnki.net/') #打开知网界面 num = driver.window_handles print(num) driver.find_element_by_id('txt_SearchText').send_keys(filename_cl)#在搜索框内输入想要搜索内容 time.sleep(2) driver.find_element_by_class_name('search-btn').click() #搜索完成 num = driver.window_handles print(num) time.sleep(3) driver.switch_to.frame("iframeResult")#框架跳转 driver.find_element_by_class_name('fz14').click()#点击搜索到的论文 time.sleep(3) num = driver.window_handles print(num) driver.switch_to.window(num[1]) driver.find_element_by_xpath("//div[@class='link']//a[@class='icon icon-output']").click() '''导出参考文献text文件''' time.sleep(2) num = driver.window_handles print(num) driver.switch_to.window(num[2]) driver.find_element_by_link_text('EndNote').click() time.sleep(1) driver.find_element_by_id('exportTxt').click() time.sleep(2) m = PyMouse() m.click(468, 582,1) m.click(733, 659,1) driver.quit() index = index + 1 print(index) 代码分析 整体思路

读取目标文件夹下所有非目录的子文件名,分别进行搜索资源下载,利用python打开火狐浏览器

1.首先定义了一个file_name函数: def file_name(file_dir): global filenames for root, dirs, filenames in os.walk(file_dir): print(root) #当前目录路径 #print(dirs) #当前路径下所有子目录 print(filenames) #当前路径下所有非目录子文件

此函数会将file_dir路径下的所有非目录的子文件名以列表的形式赋值给filenames这个全局变量

2.读取目标文件夹下的所有文件名 file_dir = "D:\我的文档" file_name(file_dir) while(filenames): file_name = filenames.pop() filenames_cl.append(file_name[4:file_name.rfind('_')])

至于while里面为什么这么处理呢,因为该懒虫重命名了每一篇论文!!!所以我不得不根据需要进行截取自己有用的片段。。。

3.打开浏览器,打开网页,定位元素,输入内容,下载资源 for filename_cl in filenames_cl: driver = webdriver.Firefox()#(firefox_profile=profile) #打开火狐浏览器 driver.get('https://www.cnki.net/') #打开知网界面 num = driver.window_handles print(num) driver.find_element_by_id('txt_SearchText').send_keys(filename_cl)#在搜索框内输入想要搜索内容 time.sleep(2) driver.find_element_by_class_name('search-btn').click() #搜索完成 num = driver.window_handles print(num)

分别取出filenames_cl中的每一个文件名,打开火狐浏览器; driver.get()打开对应网页; 获取句柄;此时句柄中只有一个元素 通过id定位输入框元素,并在输入框内输入想要搜索的内容; 等待2s,待网页打开完成,当然也可以采用隐形等待的方式,每过一段时间就搜索,直到搜索到元素; 通过类名定义到搜索键,并点击以完成搜索; 获取句柄;关于句柄,因为每次点击搜索得观察它是否是跳出新的标签页还是刷成新的页面,如果只是刷新了页面,不用换句柄,如果出了新的标签页,需要换句柄,方式见下面的代码

time.sleep(3) driver.switch_to.frame("iframeResult")#框架跳转 driver.find_element_by_class_name('fz14').click()#点击搜索到的论文 time.sleep(3) num = driver.window_handles print(num) driver.switch_to.window(num[1]) driver.find_element_by_xpath("//div[@class='link']//a[@class='icon icon-output']").click()

等待3s,待页面打开完成; 新的页面中我需要点击我搜到的结果,而该结果的元素在其他frame中,所有,这里用到了框架切换,具体是什么框架名,可以用F12在网页中查找,同理,通过class_name定位到搜索到的资源链接并点击; 现在再次查看句柄,发现句柄变成了长度为2的列表,就是因为在上一步的点击中打开了新的标签页; 此时若想要操作新的页面,就需要切换句柄,用.switch_to.window(); 通过xpath来定位元素是一个值得推荐的方法,该方法可以定位到绝大部分的元素,笔者在这一步也是被逼无奈才学了一点xpath来解决此处的问题的

'''导出参考文献text文件''' time.sleep(2) num = driver.window_handles print(num) driver.switch_to.window(num[2]) driver.find_element_by_link_text('EndNote').click() time.sleep(1) driver.find_element_by_id('exportTxt').click() time.sleep(2) m = PyMouse() m.click(468, 582,1) m.click(733, 659,1) driver.quit() index = index + 1 print(index)

接下里的几步中,前面几步同样是定位元素,然后点击; 最后一步下载所需文件时,系统跳出了下载提示选项(打开、保存,保存路径之类的),本来想进行设置,使其按设置的方式自动下载保存,可是发现由python打开的浏览器的设置都是默认设置,和我自己在浏览器中的设置毫无关系。。。 于是笔者想着能不能在程序中设置好,之后百度到了一些方法,也尝试发现没有任何用处。。。。(如果有大神路过此处,望留言告知解决方法,感激不尽) 再然后换了一种思路,控制鼠标来自动点击保存,使其保存到默认路径。 程序中通过定位到需要点击的坐标,1表示左键点击,2表示右键点击。 关于坐标获取,可以百度到很多demo程序,直接用就行了。

最后运行的结果:一次搜了40个文件,下载成功了36个,至于为什么掉了4个。 分析:笔者认为问题应该是出在了最后一步点击上面,换句话说,等待2s后,下载提示页面还没有出来,就进行了点击操作,再然后quit()关闭了浏览器。问题不可能出在其他地方,如果在其他时间中未来得及打开,程序会报错定位不到元素,以至于程序中断。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3